package com.lovar.gaming.core.domain;

import com.lovar.gaming.core.enums.SysMessageCode;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serial;
import java.io.Serializable;

/**
 * 响应信息主体
 *
 * @author Champagne9
 * @date 2024/3/7
 */
@Data
@NoArgsConstructor
public class R<T> implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    private static final int SUCCESS = 200;

    private static final int FAIL = 500;

    /**
     * 响应代码
     */
    private int code;

    /**
     * 响应子代码
     */
    private String subCode;

    /**
     * 响应信息
     */
    private String msg;

    /**
     * 响应体
     */
    private T data;

    /**
     * 请求成功（默认参数）
     */
    public static <T> R<T> ok() {
        return build(SUCCESS, null, SysMessageCode.REQUEST_SUCCESS.toMessage(), null);
    }

    /**
     * 请求成功（响应消息）
     */
    public static <T> R<T> ok(String msg) {
        return build(SUCCESS, null, msg, null);
    }

    /**
     * 请求成功（响应消息代码）
     */
    public static <T> R<T> ok(BaseMessageCode baseMessageCode) {
        return build(SUCCESS, null, baseMessageCode.toMessage(), null);
    }

    /**
     * 请求成功（响应数据）
     */
    public static <T> R<T> ok(T data) {
        return build(SUCCESS, null, SysMessageCode.REQUEST_SUCCESS.toMessage(), data);
    }

    /**
     * 请求成功（响应数据）
     * 防止响应数据类型为String时走到字符串入参的重载
     */
    public static <T> R<T> okData(T data) {
        return build(SUCCESS, null, SysMessageCode.REQUEST_SUCCESS.toMessage(), data);
    }

    /**
     * 请求成功（响应消息与数据）
     */
    public static <T> R<T> ok(String msg, T data) {
        return build(SUCCESS, null, msg, data);
    }

    /**
     * 请求成功（响应消息代码与数据）
     */
    public static <T> R<T> ok(BaseMessageCode baseMessageCode, T data) {
        return build(SUCCESS, null, baseMessageCode.toMessage(), data);
    }

    /**
     * 请求失败（默认参数）
     */
    public static <T> R<T> fail() {
        return build(FAIL, null, SysMessageCode.REQUEST_FAIL.toMessage(), null);
    }

    /**
     * 请求失败（响应消息）
     */
    public static <T> R<T> fail(String msg) {
        return build(FAIL, null, msg, null);
    }

    /**
     * 请求失败（响应消息代码）
     */
    public static <T> R<T> fail(BaseMessageCode baseMessageCode) {
        return build(FAIL, null, baseMessageCode.toMessage(), null);
    }

    /**
     * 请求失败（响应数据）
     */
    public static <T> R<T> fail(T data) {
        return build(FAIL, null, SysMessageCode.REQUEST_FAIL.toMessage(), data);
    }

    /**
     * 请求失败（响应数据）
     * 防止响应数据类型为String时走到字符串入参的重载
     */
    public static <T> R<T> failData(T data) {
        return build(FAIL, null, SysMessageCode.REQUEST_FAIL.toMessage(), data);
    }

    /**
     * 请求失败（响应消息与数据）
     */
    public static <T> R<T> fail(String msg, T data) {
        return build(SUCCESS, null, msg, data);
    }

    /**
     * 请求失败（响应消息代码与数据）
     */
    public static <T> R<T> fail(BaseMessageCode baseMessageCode, T data) {
        return build(SUCCESS, null, baseMessageCode.toMessage(), data);
    }

    /**
     * 响应构建
     */
    public static <T> R<T> build(int code, String subCode, String msg, T data) {
        R<T> r = new R<>();
        r.setCode(code);
        r.setSubCode(subCode);
        r.setMsg(msg);
        r.setData(data);
        return r;
    }

}
